﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Com.Alipay;
using System.Collections.Specialized;
using WAD.BLL;
using WAD.DAL;
using System.Text;

namespace WAD.WEB.Client2.API
{
    /// <summary>
    /// 功能：服务器异步通知页面
    /// 版本：3.3
    /// 日期：2012-07-10
    /// 说明：
    /// 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
    /// 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
    /// </summary>
    public partial class AliTX_Notify : System.Web.UI.Page
    {
        StringBuilder sb = new StringBuilder();
        protected void Page_Load(object sender, EventArgs e)
        {
            SortedDictionary<string, string> sPara = GetRequestPost();

            if (sPara.Count > 0)//判断是否有带返回参数
            {
                Notify aliNotify = new Notify();
                bool verifyResult = aliNotify.Verify(sPara, Request.Form["notify_id"], Request.Form["sign"]);

                verifyResult = IsCheck(Request.Form["notify_id"], Request.Form["pay_user_id"], Request.Form["notify_type"], Request.Form["notify_time"]);

                sb.AppendFormat("【验证状态={0}】", verifyResult);

                if (verifyResult)//验证成功
                {
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                  
                    //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
                    //判断是否在商户网站中已经做过了这次通知返回的处理
                    //如果没有做过处理，那么执行商户的业务程序
                    //如果有做过处理，那么不执行商户的业务程序


                    //批量付款数据中转账成功的详细信息
                    string success_details = Request.Form["success_details"];

                    //批量付款数据中转账失败的详细信息
                    string fail_details = Request.Form["fail_details"];
                    
                  

                    int adminid = 0;    //管理员ID
                    if (Request.Cookies["adminid"] != null && (!string.IsNullOrEmpty(Request.Cookies["adminid"].Value)))
                        adminid = Convert.ToInt32(Request.Cookies["adminid"].Value);

                    //提现成功处理
                    int count1 = FCCashBLL.Check_Ali(success_details, adminid, WAD.WEB.AppCode.WJXConfig.EncryptConfig.DES_KEY);
                    //提现失败处理
                    int count2 = FCCashBLL.Check_Ali_Fail(fail_details, adminid, WAD.WEB.AppCode.WJXConfig.EncryptConfig.DES_KEY);
                    
                    DaoLogcat.Add("ali_tixian", string.Format("支付宝提现完成,成功数{0},失败数{1}",count1,count2));  //debug 错误日志

                    DAOLog.Add(string.Format("支付宝提现【成功数{0},失败数{1}】", count1, count2), adminid, 0);  //系统日志

                    Response.Write("success");  //请不要修改或删除

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//验证失败
                {
                    DaoLogcat.Add("ali_tixian", string.Format("【验证失败】notify_id={0},pay_user_id={1},notify_type={2},notify_time={3}", Request.Form["notify_id"], Request.Form["pay_user_id"], Request.Form["notify_type"], Request.Form["notify_time"]));
                    Response.Write("fail");
                }
            }
            else
            {
                DaoLogcat.Add("ali_tixian", "无通知参数");
                Response.Write("无通知参数");
            }
        }


        /// <summary>
        /// 获取支付宝POST过来通知消息，并以“参数名=参数值”的形式组成数组
        /// </summary>
        /// <returns>request回来的信息组成的数组</returns>
        public SortedDictionary<string, string> GetRequestPost()
        {
            int i = 0;
            SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
            NameValueCollection coll;
            //Load Form variables into NameValueCollection variable.
            coll = Request.Form;

            // Get names of all forms into a string array.
            String[] requestItem = coll.AllKeys;

            
            sb.Append("全部参数：");
            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i], Request.Form[requestItem[i]]);

                //字符串参数
                sb.AppendFormat("【{0}={1}】", requestItem[i], Request.Form[requestItem[i]]);

            }
            DaoLogcat.Add("ali_tixian", sb.ToString());

            return sArray;
        }



        bool IsCheck(string notify_id, string pay_user_id, string notify_type, string notify_time)
        {
            Notify aliNotify = new Notify();
            if (aliNotify.GetResponseTxt(notify_id) != "true")  //是否来自支付宝请求
                return false;

            if (pay_user_id != WAD.WEB.AppCode.AliPayConfig.PARTNER)    //公司的付款账号ID
                return false;

            if (notify_type != "batch_trans_notify")        //batch_trans_notify 转账成功 状态
                return false;

            //notify_time 支付宝通知时间
            return true;
        }
    }
}
